home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The 640 MEG Shareware Studio 2
/
The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO
/
os2
/
pccts.zip
/
ERR.H
< prev
next >
Wrap
C/C++ Source or Header
|
1992-12-08
|
5KB
|
220 lines
/*
* err.h
*
* Standard error handling mechanism
*
* Terence Parr, Hank Dietz and Will Cohen: 1989, 1990, 1991, 1992
* Purdue University Electrical Engineering
* ANTLR Version 1.06
*/
#include <string.h>
#ifdef __STDC__
#include <stdarg.h>
#else
#include <varargs.h>
#endif
/* Define usable bits per unsigned int word (used for set stuff) */
#ifdef PC
#define WORDSIZE 16
#define LogWordSize 4
#else
#define WORDSIZE 32
#define LogWordSize 5
#endif
#define MODWORD(x) ((x) & (WORDSIZE-1)) /* x % WORDSIZE */
#define DIVWORD(x) ((x) >> LogWordSize) /* x / WORDSIZE */
/* maximum of 32 bits/unsigned int and must be 8 bits/byte */
static unsigned bitmask[] = {
0x00000001, 0x00000002, 0x00000004, 0x00000008,
0x00000010, 0x00000020, 0x00000040, 0x00000080,
0x00000100, 0x00000200, 0x00000400, 0x00000800,
0x00001000, 0x00002000, 0x00004000, 0x00008000,
0x00010000, 0x00020000, 0x00040000, 0x00080000,
0x00100000, 0x00200000, 0x00400000, 0x00800000,
0x01000000, 0x02000000, 0x04000000, 0x08000000,
0x10000000, 0x20000000, 0x40000000, 0x80000000
};
void
#ifdef __STDC__
zzresynch(unsigned *wd,unsigned mask)
#else
zzresynch(wd,mask)
unsigned *wd, mask;
#endif
{
while ( !(wd[LA(1)]&mask) && LA(1) != zzEOF_TOKEN ) {zzCONSUME;}
}
/* input looks like:
* zzFAIL(k, e1, e2, ...,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText)
* where the zzMiss stuff is set here to the token that did not match
* (and which set wasn't it a member of).
*/
void
#ifdef __STDC__
zzFAIL(int k, ...)
#else
zzFAIL(va_alist)
va_dcl
#endif
{
#ifdef LL_K
static char text[LL_K*ZZLEXBUFSIZE+1];
unsigned *f[LL_K];
#else
static char text[ZZLEXBUFSIZE+1];
unsigned *f[1];
#endif
unsigned **miss_set;
char **miss_text;
unsigned *bad_tok;
char **bad_text;
unsigned *err_k;
int i;
va_list ap;
#ifndef __STDC__
int k;
#endif
#ifdef __STDC__
va_start(ap, k);
#else
va_start(ap);
k = va_arg(ap, int); /* how many lookahead sets? */
#endif
text[0] = '\0';
for (i=1; i<=k; i++) /* collect all lookahead sets */
{
f[i-1] = va_arg(ap, unsigned *);
}
for (i=1; i<=k; i++) /* look for offending token */
{
if ( i>1 ) strcat(text, " ");
strcat(text, LATEXT(i));
if ( !zzset_el(LA(i), f[i-1]) ) break;
}
miss_set = va_arg(ap, unsigned **);
miss_text = va_arg(ap, char **);
bad_tok = va_arg(ap, unsigned *);
bad_text = va_arg(ap, char **);
err_k = va_arg(ap, unsigned *);
if ( i>k )
{
/* bad; lookahead is permutation that cannot be matched,
* but, the ith token of lookahead is valid at the ith position
* (The old LL sub 1 (k) versus LL(k) parsing technique)
*/
*miss_set = NULL;
*miss_text = zzlextext;
*bad_tok = LA(1);
*bad_text = LATEXT(1);
*err_k = k;
return;
}
/* fprintf(stderr, "%s not in %dth set\n", zztokens[LA(i)], i);*/
*miss_set = f[i-1];
*miss_text = text;
*bad_tok = LA(i);
*bad_text = LATEXT(i);
if ( i==1 ) *err_k = 1;
else *err_k = k;
}
/* standard error reporting function */
void
#ifdef __STDC__
zzsyn(char *text, unsigned tok, char *egroup, unsigned *eset, int etok, int k, char *bad_text)
#else
zzsyn(text, tok, egroup, eset, etok, k, bad_text)
char *text, *egroup, *bad_text;
unsigned tok;
int etok, k;
unsigned *eset;
#endif
{
fprintf(stderr, "line %d: syntax error at \"%s\"", zzline, (tok==zzEOF_TOKEN)?"EOF":text);
if ( !etok && !eset ) {fprintf(stderr, "\n"); return;}
if ( k==1 ) fprintf(stderr, " missing");
else
{
fprintf(stderr, "; \"%s\" not", bad_text);
if ( zzset_deg(eset)>1 ) fprintf(stderr, " in");
}
if ( zzset_deg(eset)>0 ) zzedecode(eset);
else fprintf(stderr, " %s", zztokens[etok]);
if ( strlen(egroup) > 0 ) fprintf(stderr, " in %s", egroup);
fprintf(stderr, "\n");
}
/* is b an element of set p? */
int
#ifdef __STDC__
zzset_el(unsigned b, unsigned *p)
#else
zzset_el(b,p)
unsigned b;
unsigned *p;
#endif
{
return( p[DIVWORD(b)] & bitmask[MODWORD(b)] );
}
int
#ifdef __STDC__
zzset_deg(unsigned *a)
#else
zzset_deg(a)
unsigned *a;
#endif
{
/* Fast compute degree of a set... the number
of elements present in the set. Assumes
that all word bits are used in the set
*/
register unsigned *p = a;
register unsigned *endp = &(a[zzSET_SIZE]);
register unsigned degree = 0;
if ( a == NULL ) return 0;
while ( p < endp )
{
register unsigned t = *p;
register unsigned *b = &(bitmask[0]);
do {
if (t & *b) ++degree;
} while (++b < &(bitmask[WORDSIZE]));
p++;
}
return(degree);
}
void
#ifdef __STDC__
zzedecode(unsigned *a)
#else
zzedecode(a)
unsigned *a;
#endif
{
register unsigned *p = a;
register unsigned *endp = &(p[zzSET_SIZE]);
register unsigned e = 0;
if ( zzset_deg(a)>1 ) fprintf(stderr, " {");
do {
register unsigned t = *p;
register unsigned *b = &(bitmask[0]);
do {
if ( t & *b ) fprintf(stderr, " %s", zztokens[e]);
e++;
} while (++b < &(bitmask[sizeof(unsigned)*8]));
} while (++p < endp);
if ( zzset_deg(a)>1 ) fprintf(stderr, " }");
}